package pe.com.bbva.ge.vista.vaadin.ui.component;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;

import com.vaadin.ui.TextField;

import org.vaadin.csvalidation.CSValidatedTextField;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.ui.AbstractTextField.TextChangeEventMode;

import pe.com.bbva.ge.vista.vaadin.ui.utileria.bean.PropiedadesTxtNumerico;

public class TxtNumerico extends CSValidatedTextField{

	private String regExpDecimales;
	private String regExpEnteros;
	PropiedadesTxtNumerico propiedadesTxtNumerico;

	public TxtNumerico(String caption, PropiedadesTxtNumerico propiedadesTxtNumerico) {
		super(caption);
		
		this.regExpDecimales = "^[0-9]{0,9}(\\.[0-9]{0,2})?$";
		this.regExpEnteros = "^[0-9]{0,9}$";
		this.propiedadesTxtNumerico = propiedadesTxtNumerico;
		
		this.setPreventInvalidTyping(true);
		this.setStyleName("v-textfield txtNumerico");
		
		if(this.propiedadesTxtNumerico != null)
		{
			this.setRegExp(this.propiedadesTxtNumerico.isEsDecimal() ? this.regExpDecimales : this.regExpEnteros);
		}
		
		this.setTextChangeEventMode(TextChangeEventMode.LAZY);
		this.setImmediate(true);
		
		this.addListener(new TextChangeListener() {
            private static final long serialVersionUID = 7055180877355044203L;
            
            @Override
            public void textChange(TextChangeEvent event) {
            	//if(getPropiedadesTxtNumerico().isEsDecimal())
            	//{
            		setValue(event.getText());
            	//}
        		((TextField) event.getComponent()).focus();
            }
        });
	}
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	
	public String darFormato(String valorTxt)
	{
		BigDecimal valor = BigDecimal.valueOf(Double.valueOf(valorTxt));
		
		DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
        simbolos.setDecimalSeparator('.');
        //simbolos.setGroupingSeparator();
        
        DecimalFormat dfl = new DecimalFormat("###.##", simbolos);
        
        NumberFormat df = dfl;
        
		df.setMinimumFractionDigits(2);
		df.setMaximumFractionDigits(2);
		df.setRoundingMode(RoundingMode.DOWN);
		
		return df.format(Double.valueOf(valor.toString()));
	}
	
	public PropiedadesTxtNumerico getPropiedadesTxtNumerico() {
		return propiedadesTxtNumerico;
	}
	
	public void setPropiedadesTxtNumerico(
			PropiedadesTxtNumerico propiedadesTxtNumerico) {
		this.propiedadesTxtNumerico = propiedadesTxtNumerico;
		
		if(this.propiedadesTxtNumerico != null)
		{
			this.setRegExp(this.propiedadesTxtNumerico.isEsDecimal() ? this.regExpDecimales : this.regExpEnteros);
		}
	}

	@Override
	public void setValue(Object newValue) throws ReadOnlyException,
			ConversionException {
		String valor = newValue.toString();
		
		if(!isNumeric(valor))
		{
			newValue = (Object) "0";
		}
		
		if(getPropiedadesTxtNumerico() != null)
		{
			if(getPropiedadesTxtNumerico().isEsDecimal())
	    	{
				newValue = (Object) darFormato(newValue.toString());
	    	}
		}
		
		super.setValue(newValue);
	}
	
	public boolean isNumeric(String s) {  
	    return s.matches("[-+]?\\d*\\.?\\d+");  
	}
}
